Electioneering: Part III

Final part a three-part series looking at how the composition of the Australian Federal parliament might vary under different electoral systems.

In this part, we conduct a comparative analysis of each voting system.

R
auspol
Published

November 9, 2023

Last time we determined the makeup of parliament under the three different systems. This time, we’ll reframe these results so we can perform a side-to-side analysis and draw some reasonable inferences. If you’ve skipped to the end1, a reminder that the series is divided into three parts:

  • 1 This is the good bit, though.

  • Due to the presence of list seats in an MMP system, looking at electorates alone elides the comparative advantage of the MMP system. For this reason, I’ve broken this section into two subsections: the first determines the total composition of parliament under each of FPTP, MMP, and STV, whilst the second compares the winners of electorates under FFP and STV.

    Composition by Party

    compare.parliament = votes %>%
      group_by(PartyAb) %>%
      filter(CountNumber == 0) %>%
      summarise(partyVoteN = sum(prefCount)) %>%
      mutate(partyVotePC = (partyVoteN / sum(partyVoteN)) %>%
               multiply_by(100) %>%
               round(digits = 2)) %>%
      # Join to MMP
      full_join(mmp %>%
                  select(PartyAb,
                         mmpElecSeatsN = seatsElecN,
                         mmpListSeatsN = seatsListN,
                         mmpTotSeatsN = seatsTotalN,
                         mmpTotSeatsPC = seatsTotalPC)) %>%
      # Join to STV
      full_join(stv %>%
                  group_by(PartyAb) %>%
                  summarise(stvSeatsN = n())) %>%
      # Join to FPTP
      full_join(fptp %>%
                  group_by(PartyAb) %>%
                  summarise(fptpSeatsN = n())) %>%
      # Tidy up the missing
      mutate(across(c(stvSeatsN, fptpSeatsN), ~ ifelse(is.na(.), 0, .)),
             stvSeatsPC = (stvSeatsN / sum(stvSeatsN)) %>%
                      multiply_by(100) %>%
                      round(digits = 2),
             fptpSeatsPC = (fptpSeatsN / sum(fptpSeatsN)) %>%
               multiply_by(100) %>%
               round(digits = 2)) %>%
      # Difference from party vote
      mutate(across(ends_with("SeatsPC"), ~ . - partyVotePC, .names = "{.col}_diff"))
    Comparison of Parliament Under Three Voting Systems
    Australian Federal Election 2022
    Party Party Vote (%) Mixed Member Proportional Single Transferrable Vote First Past the Post
    Seats (n) Seats (%) Deviance (%) Seats (n) Seats (%) Deviance (%) Seats (n) Seats (%) Deviance (%)
    ALP 32.58 81 36.65 4.07 77 50.99 18.41 71 47.02 14.44
    LP 23.89 59 26.70 2.81 27 17.88 -6.01 40 26.49 2.60
    GRN 12.25 31 14.03 1.78 4 2.65 -9.60 2 1.32 -10.93
    LNP 8.00 23 10.41 2.41 21 13.91 5.91 23 15.23 7.23
    IND 5.30 3 1.36 -3.94 10 6.62 1.32 3 1.99 -3.31
    ON 4.96 12 5.43 0.47 0 0.00 -4.96 0 0.00 -4.96
    UAPP 4.12 0 0.00 -4.12 0 0.00 -4.12 0 0.00 -4.12
    NP 3.60 10 4.52 0.92 10 6.62 3.02 10 6.62 3.02
    LDP 1.73 0 0.00 -1.73 0 0.00 -1.73 0 0.00 -1.73
    AJP 0.60 0 0.00 -0.60 0 0.00 -0.60 0 0.00 -0.60
    CYA 0.39 0 0.00 -0.39 0 0.00 -0.39 0 0.00 -0.39
    KAP 0.38 1 0.45 0.07 1 0.66 0.28 1 0.66 0.28
    XEN 0.25 1 0.45 0.20 1 0.66 0.41 1 0.66 0.41
    WAP 0.23 0 0.00 -0.23 0 0.00 -0.23 0 0.00 -0.23
    GAP 0.21 0 0.00 -0.21 0 0.00 -0.21 0 0.00 -0.21
    Deviance is the percentage difference between the proportion of seats held compared to the 1st preference vote.
    NB: Parties receiving fewer than 30,000 votes are not displayed.

    Composition by Electorates

    compare.seat = full_join(
      stv %>%
        mutate(name = paste(GivenNm, Surname)) %>%
        select(StateAb, DivisionNm,
               stvID = CandidateID, stvName = name, stvParty = PartyAb, stvCount = prefCount, stvMargin = margin),
      fptp %>%
        mutate(name = paste(GivenNm, Surname)) %>%
        select(StateAb, DivisionNm,
               fptpID = CandidateID, fptpName = name, fptpParty = PartyAb, fptpCount = prefCount, fptpMargin = margin),
      by = c("StateAb", "DivisionNm")) %>%
      mutate(identical = ifelse(stvID == fptpID, TRUE, FALSE)) %>%
      select(-c(stvID, fptpID))
    Comparison of Electorates with Differing Outcomes Under STV and FPTP
    Australian Federal Election 2022
    State Single Transferable Vote First Past the Post
    Elected Member Party Votes (n) Margin (n) Elected Member Party Votes (n) Margin (n)
    Bennelong NSW Jerome LAXALE ALP 50,801.00 1,954.00 Simon KENNEDY LP 41,206.00 3,610.00
    Boothby SA Louise MILLER-FROST ALP 60,579.00 7,451.00 Rachel SWIFT LP 43,196.00 6,450.00
    Brisbane QLD Stephen BATES GRN 58,460.00 8,122.00 Trevor EVANS LNP 41,032.00 11,380.00
    Curtin WA Kate CHANEY IND 53,847.00 2,657.00 Celia HAMMOND LP 43,408.00 12,466.00
    Fowler NSW Dai LE IND 44,348.00 2,793.00 Kristina KENEALLY ALP 30,973.00 5,627.00
    Gilmore NSW Fiona PHILLIPS ALP 56,039.00 373.00 Andrew CONSTANCE LP 46,941.00 6,766.00
    Goldstein VIC Zoe DANIEL IND 51,861.00 5,635.00 Tim WILSON LP 39,607.00 5,792.00
    Higgins VIC Michelle ANANDA-RAJAH ALP 49,726.00 3,941.00 Katie ALLEN LP 38,859.00 11,672.00
    Kooyong VIC Monique RYAN IND 54,276.00 6,035.00 Josh FRYDENBERG LP 43,736.00 2,433.00
    Lyons TAS Brian MITCHELL ALP 37,341.00 1,344.00 Susie BOWER LP 27,296.00 6,001.00
    Mackellar NSW Sophie SCAMPS IND 51,973.00 4,955.00 Jason FALINSKI LP 40,993.00 3,269.00
    North Sydney NSW Kylea Jane TINK IND 51,392.00 5,666.00 Trent ZIMMERMAN LP 36,956.00 12,479.00
    Robertson NSW Gordon REID ALP 50,277.00 4,344.00 Lucy WICKS LP 38,448.00 2,217.00
    Ryan QLD Elizabeth WATSON-BROWN GRN 52,286.00 5,256.00 Julian SIMMONDS LNP 38,239.00 8,236.00
    Tangney WA Sam LIM ALP 56,331.00 5,114.00 Ben MORTON LP 43,008.00 2,068.00
    Wentworth NSW Allegra SPENDER IND 48,186.00 7,449.00 Dave SHARMA LP 35,995.00 4,185.00

    Electoral Maps